#!/usr/bin/ash

# usuarios.sh
# Herramienta de administracion de usuarios para Minix 2
# Sistemas Operativos - FCEN - Universidad de Buenos Aires
# Grupo 4: Gonzalez, Martinez, Sainz-Trapaga


########################################################
# Chequeo de permisos                                  #
########################################################

if [ `whoami` != "root" ]
    then
    echo "Este programa solo puede ser ejecutado por el administrador!"
    echo "[abortado]"
    exit 1
fi




########################################################
# Ayuda para el menu principal                         #
########################################################

ayuda() {
    echo "--------------------------------------"
    echo "Menu Principal"
    echo "--------------------------------------"
    echo "n - Crear un nuevo usuario"
    echo "m - Modificar un usuario existente"
    echo "b - Borrar un usuario"
    echo "h - Ver esta ayuda"
    echo "s - Salir"
    echo
}




########################################################
# Creacion de nuevos usuarios                          #
########################################################

nuevo() {
    echo "Ingrese el nombre del usuario que desea crear (alfanumerico, minusculas, hasta 8 caracteres):"
    read USERNAME
    if grep "^${USERNAME}:" /etc/passwd > /dev/null
        then
        echo "Ya existe un usuario de nombre $USERNAME";
        echo "[abortado]"
        return
    fi

    if echo "$USERNAME" | grep "^[a-z][a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?$" > /dev/null
        then :
    else
        echo "El nombre de usuario no cumple las condiciones pedidas!"
        echo "[abortado]"
        return
    fi

    echo "Creando usuario $USERNAME"
    echo "Ingrese el directorio home del usuario (no debe existir aun):"
    read HOMEDIR
    if [ -d $HOMEDIR ]
        then
        echo "El directorio $HOMEDIR ya existe";
        echo "[abortado]"
    else
        # creo las carpetas padres del directorio home
        # para evitar el error que tira adduser en ese caso
        mkdir -p $HOMEDIR
        rmdir $HOMEDIR
    fi
    echo "Ingrese el grupo del usuario (alfanumerico, minusculas, hasta 8 caracteres):"
    read GRUPO
    if echo "$GRUPO" | grep "^[a-z][a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?$" > /dev/null
        then :
    else
        echo "El nombre de grupo no cumple las condiciones pedidas!"
        echo "[abortado]"
        return
    fi

    if grep "^${GRUPO}:" /etc/group > /dev/null
        then :
    else
        echo "Creando grupo $GRUPO..."
        MAXIDGRUPO=`grep -v "^nogroup:" /etc/group | awk 'BEGIN {FS=":"};{print $3}' | sort | tail -1`
        IDNUEVOGRUPO=`echo "$MAXIDGRUPO + 1" | bc`
        echo "$GRUPO:*:$IDNUEVOGRUPO:" >> /etc/group

    fi
    adduser $USERNAME $GRUPO $HOMEDIR
    chown -R $USERNAME:$GRUPO $HOMEDIR
    echo "El usuario fue creado con exito!"
    echo
    echo "Cambiando el password del usuario $USERNAME..."
    passwd $USERNAME
    echo
    echo "Ingrese el shell para el usuario $USERNAME:"
    read USERSHELL
    if [ -f $USERSHELL ]
        then
        chsh $USERNAME $USERSHELL
    else
        echo "El shell elegido no existe!"
        echo "[abortado] Use el menu de modificacion para cambiar el shell de $USERNAME";
        return
    fi
}




########################################################
# Modificacion de usuarios existentes                  #
########################################################

ayuda_modificacion() {
    echo "------------------------------"
    echo "Modificar usuario $USERMOD"
    echo "------------------------------"
    echo "c - Cambiar password"
    echo "d - Cambiar directorio home"
    echo "b - Cambiar shell"
    echo "g - Cambiar grupo"
    echo "h - Ver esta ayuda"
    echo "s - Volver al menu principal"
    echo
}

menu_modificacion() {
    ayuda_modificacion
    while true; do
        echo "Ingrese la modificacion elegida:"
        read ACCION_MOD
        case "$ACCION_MOD" in
            c) echo "Cambiando el password de $USERMOD..."
               passwd $USERMOD
               echo "El password fue cambiado con exito!";;
               
            h) ayuda_modificacion;;

            d) echo "Ingrese el nuevo directorio home para $USERMOD:"
               read NUEVOHOME
               if [ -d $NUEVOHOME ]
                 then :
               else
                 echo "Creando directorio $NUEVOHOME..."
                 mkdir -p $NUEVOHOME
               fi
                
               chown -R $USERMOD $NUEVOHOME

               # cambio el home del usuario en /etc/passwd
               HOMEVIEJO=`grep "^$USERMOD:" /etc/passwd | awk 'BEGIN {FS=":"};{print $6}'`
               sed -e "/^$USERMOD:/s:$HOMEVIEJO:$NUEVOHOME:g" /etc/passwd > /tmp/passwd.copy
               mv /tmp/passwd.copy /etc/passwd
               chmod 644 /etc/passwd
               echo "El directorio home de $USERMOD fue cambiado con exito a $NUEVOHOME!";;  

            b) echo "Ingrese el nuevo shell para $USERMOD:"
               read NUEVOSH
               if [ -f $NUEVOSH ]
                 then chsh $USERMOD $NUEVOSH
                 echo "El shell de $USERMOD fue cambiado con exito a $NUEVOSH!"
               else
                 echo "El shell indicado no existe!"
                 echo "[abortado]"
               fi;;

            g) echo "Ingrese el grupo para $USERMOD (alfanumerico, minusculas, hasta 8 caracteres):"
               read NUEVOGRUPO

               if echo "$NUEVOGRUPO" | grep "^[a-z][a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?[a-z0-9]?$" > /dev/null
                   then
                   if grep "^$NUEVOGRUPO" /etc/group > /dev/null
                     then :
                   else
                     echo "Creando el grupo $NUEVOGRUPO..."
                     MAXIDGRUPO=`grep -v "^nogroup:" /etc/group | awk 'BEGIN {FS=":"};{print $3}' | sort | tail -1;`
                     IDNUEVOGRUPO=`echo "$MAXIDGRUPO + 1" | bc`
                     echo "$NUEVOGRUPO:*:$IDNUEVOGRUPO:" >> /etc/group
                   fi
                   
                   # cambio el gid del usuario en /etc/passwd
                   sed -e "/^$USERMOD:/s/^\([^:]*:[^:]*:[^:]*:\)[^:]*/\1${IDNUEVOGRUPO}/" /etc/passwd > /tmp/passwd.copy
                   mv /tmp/passwd.copy /etc/passwd
                   chmod 644 /etc/passwd
                   
                   # cambio el grupo del home del usuario
                   HOMEVIEJO=`grep "^$USERMOD:" /etc/passwd | awk 'BEGIN {FS=":"};{print $6}'`
                   chgrp $NUEVOGRUPO $HOMEVIEJO
                   echo "El grupo de $USERMOD fue cambiado con exito a $NUEVOGRUPO!"
               else
                   echo "El nombre de grupo no cumple las condiciones pedidas!"
                   echo "[abortado]"
                   
               fi
               ;;

            s) return ;;

            *) echo "Comando no valido - ingrese 'h' para ver la ayuda";;
        esac
    done
}

# ciclo principal de menu de modificacion de usuarios
modificar() {
    echo "Ingrese el nombre del usuario que desa modificar:"
    read USERMOD
    if grep "^$USERMOD:" /etc/passwd > /dev/null
        then :
    else
        echo "El usuario $USERMOD no existe!"
        echo "[abortado]"
        return
    fi
   
    menu_modificacion
}



########################################################
# Borrado de usuarios                                  #
########################################################

borrar() {
    echo "Ingrese el nombre del usuario que desea borrar:"
    read USERDEL
    if [ "$USERDEL" = "root" ]
        then
        echo "No se puede borrar al usuario administrador!"
        echo "[abortado]"
        return
    fi
    if grep "^$USERDEL:" /etc/passwd > /dev/null
        then :
    else
        echo "El usuario $USERDEL no existe!"
        echo "[abortado]"
        return
    fi

    UID=`grep "^$USERDEL:" /etc/passwd | awk 'BEGIN {FS=":"};{print $3}'`
    CUANTOSARCHIVOS=`find / -user $UID | wc -l`
    echo "Borrando $CUANTOSARCHIVOS archivos del usuario $USERDEL..."
    find / -user $UID | xargs rm -rf

    echo "Borrando el usuario $USERDEL..."
    grep -v "^${USERDEL}:" /etc/passwd > /tmp/passwd.copy
    mv /tmp/passwd.copy /etc/passwd
    chmod 644 /etc/passwd
    grep -v "^${USERDEL}:" /etc/shadow > /tmp/shadow.copy
    mv /tmp/shadow.copy /etc/shadow
    chmod 600 /etc/shadow
}



########################################################
# Ciclo principal del programa                         #
########################################################

ayuda

while true; do
    echo "Ingrese un comando:"
    read ACCION
    
    case "$ACCION" in

        n)  nuevo;;
        m)  modificar;;
        b)  borrar;;
        h)  ayuda;;
        s)  echo "Adios!"; exit 0;;
        *)  echo "Comando no valido - ingrese 'h' para ver la ayuda";;
    
    esac
done
